# encoding: utf-8
# id                       | integer                     | not null default nextval('transacoes_id_seq'::regclass)
# data                     | date                        | 
# valor                    | numeric(10,2)               | 
# observacao               | character varying(255)      | 
# conta_id                 | integer                     | 
# tipo                     | integer                     | 
# created_at               | timestamp without time zone | not null
# updated_at               | timestamp without time zone | not null
# type                     | character varying(255)      | 
# quitada                  | boolean                     | default false
# usuario_id               | integer                     | 
# transacao_relacionada_id | integer                     | 
# parcelado_id             | integer                     | 
# ordem                    | integer                     | 
class Transacao < ActiveRecord::Base
	include TipoTransacao

  attr_protected	

  belongs_to :conta
  has_one :transacao_relacionada,
  	:class_name => "Transacao",
  	:foreign_key => "transacao_relacionada_id"

	validates :usuario_id,
		:presence => { :unless => :consolidada?, :message => "deve ser informada se não informar uma conta" }

	#
	#
	def consolidada?
		!conta.nil?
	end

	#
	#
	def possui_relacionada?
		!transacao_relacionada.nil?
	end

	#
	#
	def self.pendentes(usuario, periodo)
		raise ArgumentError, "Periodo deve ser uma data" if periodo.nil? or !periodo.is_a? Date
		raise ArgumentError, "usuario deve ser do tipo Usuario" if usuario.nil? or !usuario.is_a? Usuario
		
		usuario.transacoes.where("(conta_id is null or quitada = false) and " +
										"date_part('month', data) = ? and " +
										"date_part('year', data) = ?",
										periodo.month, periodo.year).order("data asc")
	end

  #
  #
	def self.extrato(conta, periodo, nao_quitadas, omitir_transferencias)
		raise ArgumentError, "Periodo deve ser uma data" if periodo.nil? or !periodo.is_a? Date

		conditions = (nao_quitadas) ? [] : ["conta_id is not null", "valor is not null"]
		values = []
		
		if conta
			conditions << "conta_id = ?"
			values << conta
		end
		
		if periodo
			conditions << "date_part('month', data) = ? and date_part('year', data) = ?"
			values << periodo.month
			values << periodo.year
		end
		
		if omitir_transferencias
			conditions << "transacao_relacionada_id is null"
		end
		
		Transacao.where(values.prepend(conditions.join(" and "))).order("data asc")
	end
end
